package com.web.onirigi.redis;



import java.util.concurrent.locks.ReentrantLock;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.web.onirigi.util.BaseUtil;

/**
 * redis 中的util 操作
 * @author ASUS
 * 创建时间  2017年10月11日 下午9:53:48
 *
 */
@Service
public class RedisService {
	
	private static final Logger LOGGER=LoggerFactory.getLogger(RedisService.class);

	private ReentrantLock  look=new ReentrantLock();
	
	@Autowired
	private RedisDao  redisDao;
	
	private final static int QUEUE_MIN_NUM =10_000;
	
	/**
	 * 订单索引最大阈值
	 */
	private final static int QUEUE_MAX_NUM =100_000;
	
	
	/**
	 * 得到订单号 出队右出
	 * @author ASUS
	 * 创建时间  2017年10月11日 下午9:58:01
	 * @return
	 */
	public synchronized String getSeqNoIndex() {
		try {
		
			String  index  =redisDao.rightPop(RedisKeyUtil.UUID_KEY);
			if(null == index) {
				autoAdd(QUEUE_MAX_NUM-1);
				index =String.valueOf(QUEUE_MAX_NUM);
			}
			
			if(Integer.parseInt(index) ==QUEUE_MIN_NUM) {
				autoAdd(QUEUE_MAX_NUM);
			}
			
			int length =index.length();
			if(length<6) {
				for(int i = 1; i <= 6-length; i++) {
					index = "0"+index;
				}
			}
			
			return index;
		} catch (Exception e) {
			
			LOGGER.error("获取订单号redis索引值异常",e);
		}finally {
			
		}
		
		return null;
	}
	
	
	/**
	 * 异步生成需要的索引队列值
	 * @author ASUS
	 * 创建时间  2017年10月11日 下午10:22:09
	 * @param maxNum
	 */
	public void autoAdd(final int maxNum) {
		
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				try {
					for(int i=maxNum ;i>=1;i--) {
						put(String.valueOf(i));
					}
				} catch (Exception e) {
					LOGGER.error("redis入队生成订单索引异常",e);
				}
			}
		}).start();
	}
	
	/**
	 * 入队
	 * @author ASUS
	 * 创建时间  2017年10月11日 下午10:23:05
	 * @param value
	 */
	public void put(String value) {
		redisDao.put(RedisKeyUtil.UUID_KEY, value);
	}
	
	/**
	 * 创建token 并且设置过期时间
	 * @author ASUS
	 * 创建时间  2017年10月14日 上午9:54:42
	 * @param key
	 * @param value
	 */
	public void createToken(String key , String value) {
		redisDao.set(key, value, BaseUtil.GLOGLE_TOKEN_TIME);
	}
	
	/**
	 * 删除对应的key
	 * @author ASUS
	 * 创建时间  2017年10月14日 上午11:44:19
	 * @param key
	 */
	public void removeKey(String key) {
		redisDao.remove(key);
	}
	
}
